package com.itheima.Tree;

import javax.imageio.event.IIOReadProgressListener;

import static java.util.Collections.swap;

/**
 * @Author: Ethan Yankang
 * @Program: code-random-recordings
 * @Date: 2024-08-04 11:25
 **/
public class InvertTree {
//    public TreeNode invertTree(TreeNode root) {
//
//        if(root==null)return null;
////        交换根节点点左右节点，根节点的左右节点完成了翻转
//        TreeNode tempNode=root.left;
//        root.left=root.right;
//        root.right=tempNode;
//
////        对于根节点来说，翻转的操作还灭有完成因为他的子节点还要完成相同的操作呢！下面将这种操作应用于其子节点上即可。那么根节点点
////        工作结束了，完成了一个节点，整棵树也就结束了，这就是递归的递归性质（因为其他所有的节点都会完成这个操作，那所有及节点都完成相应操作了，整棵树也就完成了相应操作（翻转））
//        invertTree(root.left);
//        invertTree(root.right);
//        return root;
//    }

 public TreeNode invertTree(TreeNode root) {

        if(root==null)return null;
//        交换根节点点左右节点，根节点的左右节点完成了翻转

        swap(root);
//        TreeNode tempNode=root.left;
//        root.left=root.right;
//        root.right=tempNode;
//
//        对于根节点来说，翻转的操作还灭有完成因为他的子节点还要完成相同的操作呢！下面将这种操作应用于其子节点上即可。那么根节点点
//        工作结束了，完成了一个节点，整棵树也就结束了，这就是递归的递归性质（因为其他所有的节点都会完成这个操作，那所有及节点都完成相应操作了，整棵树也就完成了相应操作（翻转））
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }

    private void swap(TreeNode root) {
        TreeNode tempNode=root.left;
        root.left=root.right;
        root.right=tempNode;
    }

      public static void main(String[] args) {
        // 创建一个简单的二叉树
        TreeNode root = new TreeNode(4);
        root.left = new TreeNode(2);
        root.right = new TreeNode(7);
        root.left.left = new TreeNode(1);
        root.left.right = new TreeNode(3);
        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(9);

        InvertTree inverter = new InvertTree();
          System.out.println("翻转前");
          inorderTraversal(root);
        TreeNode invertedRoot = inverter.invertTree(root);
          System.out.println();
          System.out.println("翻转后");
        // 输出翻转后的树的中序遍历（仅作为一种简单验证方式）
        inorderTraversal(invertedRoot);
    }

    // 中序遍历用于验证
    private static void inorderTraversal(TreeNode node) {
        if (node == null) return;
        inorderTraversal(node.left);
        System.out.print(node.val + " ");
        inorderTraversal(node.right);
    }
}

















//理步骤、讲解全貌、代码实现、回扣代码细节（注意事项、为什么这么实现）、再次回扣全题的实现。
/*
* 理步骤：
* 翻转：每一个节点将其完整的翻转操作实现了即可。   具体来说是在一个节点的操作中，先将该节点翻转，再将该节点的左右节点翻转，这样针对于该节点的工作就完成了，那么所有的节点工作也就完成了。
*
*
* 核心思想：
* 原因：确认递归是一种操作+我们把一个递归的基本单位的所有情况考虑到就行。
* 注意点：要考虑完所有数据对象的情况。    具体来说叶子结点，他的左右子节点没有，那么就要在开头加入这个判断条件。这也是为什么要加这个条件的原因，一些说法是说这事递归的终止条件，个人认为这只是为了满足所有节点均可遍历的前提条件罢了（因为遍历完了自然就结束了）
*
* 代码实现：
*
*
*
* 回扣细节与技巧：
*0.功能代码块最好封装起来
*1.辅助方法的实现，直接李颖idea生成。
*2.辅助方法的构成：作用域为private、传入引用时）返回值为void(解耦)
*3.测试时采用中序遍历，效果一目了然
*
* 再次总览全题：
*
*
*
*
*
*
*
*
*
* */